iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0
Security

picoCTF 刷題分享系列 第 3

picoCTF 刷題分享---Day 3(刷題去)

  • 分享至 

  • xImage
  •  

昨天的Picker I不難吧~但其實...他是系列題會越來越難(🫠🫠今天來解決這系列吧!


題目:Picker II

hint:Can you do what win does with your input to the program?
解題思路:

  • 前面的部分基本大同小異
  • 一樣是觀察sourse code
  • 目前觀察下來可以知道以下幾點:
      1. 因為是用eval(),所以是可以輸入像是print()之類的指令
      1. 會用filter()檢查Input()是否包含"win",所以不能直接打
      1. 查看到win()發現他是讀取伺服器上的檔案(flag.txt)
  • 所以直接在輸入中讀取檔案即可,不需要用到esoteric(我也不知道她在幹嘛,之後看看)
  • 故 開始動手吧
  • 在terminal輸入 $ nc hostname port
  • $ print(open('flag.txt','r').read())
  • 這樣就可以取得檔案內容啦
    統整一下:
$ nc hostname port
$ print(open('flag.txt','r').read())

接著你就可以得到你的flag啦!!!!!
格式:picoCTF{YOUR_FLAG~~~~~~}

來到可怕的第三關了
感覺就會用到很煩的東西(😩


題目:Picker III(這題好難😭😭)

hint:Is there any way to modify the function table?
Description:
https://ithelp.ithome.com.tw/upload/images/20240916/20164155H6nq0yQl62.png


解題思路:

  • 分析檔案(準備好了嗎很複雜喔🫠🫠)
  • 第一步會先reset table(179,括弧內是行號)
  • 到二步會到while (USER_ALIVE):
  • 輸入choice = input('==> ')
  • 直到if( choice == 'quit' or choice == 'exit' or choice == 'q' )
  • 當choice == 1 ~ 4會執行call_func(choice-1)(因為call_func從0開始)
  • 當choice合理會call get_func(n)並把結果回傳到func_name
  • get_func(n)會進行以下動作
    • https://ithelp.ithome.com.tw/upload/images/20240916/20164155H98YVUAABq.png
      • 檢查n是否在table內
    • https://ithelp.ithome.com.tw/upload/images/20240916/20164155Tme1kuHQKV.png
      • 翻譯:每個func_name都有固定的長度,要第幾個就乘幾
    • https://ithelp.ithome.com.tw/upload/images/20240916/20164155HqA39GbgFF.png
      • 翻譯:i 把func_name從頭跑到尾如果遇到空格就把
        func_table[func_name_offset:i]寫入func_name
        這裡在做的是其實就是檢查輸入的值只取第一段,
        並執行func_name = func_table[func_name_offset:i]
        這樣最後的eval(func_name+'()')就會直接執行了
      • 如果func_table[i]沒有值那就
        func_name = func_table[func_name_offset:i]
        翻譯:func_name = func_table[從頭到目前的位移量]
      • https://ithelp.ithome.com.tw/upload/images/20240916/20164155AqvfUIKmXp.png
      • 翻譯:如果沒有找到空白字符(意味著函式名稱佔據了整個 FUNC_TABLE_ENTRY_SIZE 的長度),
        則直接將該區段的字串作為函式名稱func_name = func_table[從頭到尾]
    • 最後再回傳func_name並執行eval(func_name+'()')

  • 在這個地方可以注意func_name可以等於write_variable、read_variable...
  • 所以當我們輸入read_variable再次回到輸入choice = input('==> ')時輸入
  • 2(就是跟程式要求執行read_variable時其實執行的是他的值也就是win)
  • 就會得到win裡面的flag.content的Hex值
  • 再到cyberChef解碼(跟上篇一樣的步驟(from Hex...))
  • 就可以得到flag{YOUR_FLAG~~~}
    統整一下:
$ nc hostname port
==>$ 1
1: print_table
2: read_variable
3: write_variable
4: getRandomNumber
==>$ 3
Please enter variable name to write:$ read_variable
Please enter new value of variable:$ win
==>$ 2
flag.hex()...
再解碼就得到picoCTF{YOUR_FLAG~~~}

後記
後繼無力...這萬惡的Picker III她困難的點在於...他很困難,簡單來說其實不簡單(不鬧了
但這其實可以看成我把read_variable替換成win所以當我最後在進行read_variable時其實就在執行win
不能像Picker II 輸入print(open('flag.txt','r').read())的原因是有檢查長度了會被擋掉
花了我5,6個小時真萬惡阿~~~祝各位中秋節快樂!!!一起來pico吧(沒


上一篇
picoCTF 刷題分享---Day 2(刷題去)
下一篇
picoCTF 刷題分享---Day 4(刷題去)
系列文
picoCTF 刷題分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言